package com.designpattern.StatePattern;


/**
 * @Author yp
 * @Date 2021-06-21
 * @Description 状态抽象类，这里定义类一个属性，也可以定义函数
 **/
public abstract class ThreadState {
    protected String stateName; //状态名
}

/**
 * 具体状态类
 * 每个状态下可以处理不同逻辑
 */
class NewState extends ThreadState{
    public NewState(){
        stateName="新建状态";
        System.out.println("当前线程处于：新建状态.");
    }
    public void start(ThreadContext hj){
        System.out.print("调用start()方法-->");
        if(stateName.equals("新建状态")){
            hj.setState(new RunnableState());
        }
        else
        {
            System.out.println("当前线程不是新建状态，不能调用start()方法.");
        }
    }
}
//具体状态类：就绪状态
class RunnableState extends ThreadState
{
    public RunnableState()
    {
        stateName="就绪状态";
        System.out.println("当前线程处于：就绪状态.");
    }
    public void getCPU(ThreadContext hj)
    {
        System.out.print("获得CPU时间-->");
        if(stateName.equals("就绪状态"))
        {
            hj.setState(new RunningState());
        }
        else
        {
            System.out.println("当前线程不是就绪状态，不能获取CPU.");
        }
    }
}
//具体状态类：运行状态
class RunningState extends ThreadState
{
    public RunningState()
    {
        stateName="运行状态";
        System.out.println("当前线程处于：运行状态.");
    }
    public void suspend(ThreadContext hj)
    {
        System.out.print("调用suspend()方法-->");
        if(stateName.equals("运行状态"))
        {
            hj.setState(new BlockedState());
        }
        else
        {
            System.out.println("当前线程不是运行状态，不能调用suspend()方法.");
        }
    }
    public void stop(ThreadContext hj)
    {
        System.out.print("调用stop()方法-->");
        if(stateName.equals("运行状态"))
        {
            hj.setState(new DeadState());
        }
        else
        {
            System.out.println("当前线程不是运行状态，不能调用stop()方法.");
        }
    }
}
//具体状态类：阻塞状态
class BlockedState extends ThreadState
{
    public BlockedState()
    {
        stateName="阻塞状态";
        System.out.println("当前线程处于：阻塞状态.");
    }
    public void resume(ThreadContext hj)
    {
        System.out.print("调用resume()方法-->");
        if(stateName.equals("阻塞状态"))
        {
            hj.setState(new RunnableState());
        }
        else
        {
            System.out.println("当前线程不是阻塞状态，不能调用resume()方法.");
        }
    }
}
//具体状态类：死亡状态
class DeadState extends ThreadState
{
    public DeadState()
    {
        stateName="死亡状态";
        System.out.println("当前线程处于：死亡状态.");
    }
}
